import $mUtils from '@/common/utils'
import store from '@/store'
import uniCrazyRouter from 'uni-crazy-router'
// #ifdef H5
import WechatConfig from '@/common/jweixin/wechat-config'
// #endif

export function setupRouter(app: any) {
	// 接收vue3的实例，并注册uni-crazy-router
	app.use(uniCrazyRouter)
}

/**
 * @param uni-pages-hot-modules 模块化托管路由至 pages.js 路由新增/修改存在更热问题
 * @param uni-crazy-router 路由守卫加载并解析，新增/修改路由无动态加载，推荐重新启动项目
 * @param uni-simple-router V3版本收费，则路由守卫、模块化、跳转独立封装，融合存在问题
 */
const pagesRouter: any = {}
// const { pages, subPackages } =
// 	/* #include src/pages.json */
// 	// eslint-disable-next-line no-use-before-define
// 	pages.forEach(item => {
// 		pagesRouter[item.path] = item
// 	})
// subPackages.forEach(item => {
// 	item.pages.forEach(key => {
// 		pagesRouter[`${item.root}/${key.path}`] = key
// 	})
// })

// eslint-disable-next-line no-unused-vars
uniCrazyRouter.beforeEach((to, from, next) => {
	// 判断登录路径并且已经登录
	if (to.url == 'pages/login/login' && store.user.hasLogin) {
		uniCrazyRouter.afterNotNext(() => {
			// 拦截路由，并且跳转去其他页面
			$mUtils.replaceAll('/pages/index/index')
		})
	} else if (pagesRouter[to.url]?.requiresAuth && !store.user.hasLogin) {
		// 需要权限的页面
		uniCrazyRouter.afterNotNext(() => {
			// 拦截路由，并且跳转去其他页面
			$mUtils.replaceAll({
				path: '/pages/login/login',
				query: {
					redirectUrl: to.url, // 登录成功后的重定向地址和参数
					...to.query
				}
			})
		})
	} else {
		next()
	}
})

uniCrazyRouter.afterEach(to => {
	// 判断登录路径并且已经登录
	if (to.url == 'pages/login/index' && store.user.hasLogin) {
		// 拦截路由，并且跳转去其他页面
		$mUtils.replaceAll('/pages/index/index')
	} else if (pagesRouter[to.url]?.requiresAuth && !store.user.hasLogin) {
		// 拦截路由，并且跳转去其他页面
		$mUtils.replaceAll({
			path: '/pages/login/login',
			query: {
				redirectUrl: to.url, // 登录成功后的重定向地址和参数
				...to.query
			}
		})
	}
	// #ifdef H5
	if (pagesRouter[to.url]?.requireWechatSdk) {
		// 配置微信公众号SDK
		WechatConfig.config()
	}
	// #endif
})

uniCrazyRouter.onError(error => {
	// 拦截路由，并且跳转去其他页面
	$mUtils.replaceAll('/pages/index/index')
	throw new Error(`uniCrazyRouter.onError：${error.url}`)
})
